import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

sns.set(style="white", font_scale=1.5)
plt.rcParams['font.sans-serif'] = "Simsun"  # 支持中文字体

# Excel文件路径
excel_file = 'D:\文档\DLMU\GRO实验结果.xlsx'

# 使用pandas读取Excel文件
xls = pd.ExcelFile(excel_file)
sheet_names = xls.sheet_names

# 初始化数据列表
data = []

# 遍历所有 Sheet，读取数据并根据狮群数量列标记种群大小
for sheet_name in sheet_names:
    df = pd.read_excel(excel_file, sheet_name=sheet_name)
    if all(df.columns.isnull()):  # 如果所有列名都为空
        continue
    df = df.dropna(how="all")  # 去除完全空的行
    if "狮群" in df.columns:
        df["Population Size"] = df["狮群"].iloc[0]  # 使用第一个值作为种群大小
    else:
        continue  # 如果缺少狮群列，跳过该 sheet
    data.append(df)

# 合并所有数据
all_data = pd.concat(data, ignore_index=True)

# 获取唯一的种群大小列表
population_sizes = all_data["Population Size"].unique()

# 初始化绘图
plt.figure(figsize=(12, 8))

# 遍历每个种群大小并绘制到同一图上
for pop_size in population_sizes:
    subset = all_data[all_data["Population Size"] == pop_size]  # 按种群大小筛选数据
    sns.lineplot(
        data=subset,
        x="迭代",  # x 轴：迭代次数
        y="目标函数",  # y 轴：目标函数值
        label=f"狮群数量: {int(pop_size)}",
        # ci=None,
        linewidth=3,  # 设置折线宽度
        # alpha=0.5  # 增加透明度，让阴影不影响主线条
    )

# 设置图形标题和标签
plt.title("不同狮群数量下的目标函数变化", fontsize=16)
plt.xlabel("迭代次数", fontsize=14)
plt.ylabel("目标函数值", fontsize=14)

plt.xlim(0, 100)  # 将x轴范围从0到200

plt.legend(title="狮群数量", title_fontsize=12, fontsize=10, loc='upper right')
plt.tight_layout()

# 显示图形
plt.show()